#include "stm32f10x.h"
#include "Encoder.h"

int16_t Encoder = 0;//接收数据
//旋转编码器的配置与中断设置
void Encoder_Init(void)
{
    //RCC开启外设
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);
//配置GPIOA
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//配置AFIO 复用功能
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);
/*EXTI初始化*/
	EXTI_InitTypeDef EXTI_InitStructure;						//定义结构体变量
	EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;		//选择配置外部中断的0号线和1号线
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;					//指定外部中断线使能
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;			//指定外部中断线为中断模式
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;		//指定外部中断线为下降沿触发
	EXTI_Init(&EXTI_InitStructure);								//将结构体变量交给EXTI_Init，配置EXTI外设
	
	/*NVIC中断分组*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);				//配置NVIC为分组2
																//即抢占优先级范围：0~3，响应优先级范围：0~3
																//此分组配置在整个工程中仅需调用一次
																//若有多个中断，可以把此代码放在main函数内，while循环之前
																//若调用多次配置分组的代码，则后执行的配置会覆盖先执行的配置
	
	/*NVIC配置*/
	NVIC_InitTypeDef NVIC_InitStructure;						//定义结构体变量
	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;			//选择配置NVIC的EXTI0线
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC线路使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	//指定NVIC线路的抢占优先级为1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;			//指定NVIC线路的响应优先级为1
	NVIC_Init(&NVIC_InitStructure);								//将结构体变量交给NVIC_Init，配置NVIC外设

	NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;			//选择配置NVIC的EXTI1线
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC线路使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	//指定NVIC线路的抢占优先级为1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;			//指定NVIC线路的响应优先级为2
	NVIC_Init(&NVIC_InitStructure);								//将结构体变量交给NVIC_Init，配置NVIC外设
}

//接收数据
int16_t Get_Encoder(void)
{
	int16_t Temp;
	Temp=Encoder;
	Encoder =0;
    return Temp;
}
//中断触发
void EXTI0_IRQHandler(void)
{
    //防止干扰抖动
    if(EXTI_GetITStatus(EXTI_Line0) == SET){
 if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0)//判断是否是下降沿  正交旋转，波形相差90能够用来判断方向
    {
        if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0)//判断是否是下降沿
    {
      Encoder--;
    }
    }
			
 
    
		EXTI_ClearITPendingBit(EXTI_Line0);			//清除外部中断1号线的中断标志位
													//中断标志位必须清除
			}										//否则中断将连续不断地触发，导致主程序卡死
    }


//函数是cpu内部的，不需要声明
		
void EXTI1_IRQHandler(void)
{
    //防止干扰抖动
	
    if(EXTI_GetITStatus(EXTI_Line1) == SET){
 
			   if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0)//判断是否是下降沿
    {
     if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0)//判断是否是下降沿  正交旋转，波形相差90能够用来判断方向
    {
      Encoder++;
    }
    }
   

		EXTI_ClearITPendingBit(EXTI_Line1);			//清除外部中断1号线的中断标志位
													//中断标志位必须清除
													//否则中断将连续不断地触发，导致主程序卡死
    }

}
